package org.apache.ibatis.common.reflection.invoker;

import java.lang.reflect.InvocationTargetException;

/**
 * @Name Invoker
 * @Description: 执行器接口
 * 描述信息：该接口主要基于反射技术实现对象方法的调用和对象属性的读写操作。它主要有三个实现：
 * - GetFieldInvoker：获取目标属性值执行器，该实现类主要完成对象属性值的读操作；
 * - SetFieldInvoker：设置目标属性值执行器，该实现类主要完成对象属性值的写操作；
 * - MethodInvoker：调用目标方法执行器，该实现类主要完成对象非 Setter & Getter 方法的调用操作。
 * @Version v1.0.0
 * @Author: lichao
 * @Date: 2024-04-25 14:56:18
 **/
public interface Invoker {

    /**
     * 获取目标方法的类型
     * 如果目标方法有入参，则获取第一个入参类型；
     * 否则，获取返回值类型。
     *
     * @return java.lang.Class<?> 结果
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:01:16
     */
    Class<?> getType();

    /**
     * 执行器实现逻辑
     * 1. 获取目标属性值
     * 2. 设置目标属性值
     * 3. 调用非 Setter & Getter 方法
     *
     * @param target 目标对象
     * @param args   目标方法参数值列表
     * @return java.lang.Object 返回值
     * @version v1.0.0
     * @author lichao
     * @date 2024-04-25 15:03:46
     */
    Object invoke(Object target, Object[] args) throws IllegalAccessException, InvocationTargetException;

}
